/*
 FreeModbus 协议栈的核心配置头文件，通过宏定义控制协议栈的功能开关、参数设置和资源分配，
 允许用户根据硬件资源和实际需求裁剪协议栈功能，实现 “按需编译”（只编译需要的模块，节省存储空间）
*/

#ifndef _MB_CONFIG_H
#define _MB_CONFIG_H  // 防止头文件重复包含

#ifdef __cplusplus
PR_BEGIN_EXTERN_C  // 确保 C++ 编译器以 C 语言方式编译以下代码
#endif

/* ----------------------- Defines ------------------------------------------*/

/*! \brief 启用 Modbus 主机 ASCII 模式
* 取值：0=禁用，1=启用
* 当前配置：禁用（0），不编译主机 ASCII 相关代码
*/
#define MB_MASTER_ASCII_ENABLED                 (  0 )

/*! \brief 启用 Modbus 主机 RTU 模式
 * 取值：0=禁用，1=启用
 * 当前配置：启用（1），编译主机 RTU 相关代码（如帧发送/接收、CRC 校验）
 */
#define MB_MASTER_RTU_ENABLED                   (  1 )

 /*! \brief 启用 Modbus 主机 TCP 模式
  * 取值：0=禁用，1=启用
  * 当前配置：禁用（0），不编译主机 TCP 相关代码
  */
#define MB_MASTER_TCP_ENABLED                   (  0 )

  /*! \brief 启用 Modbus 从机 ASCII 模式
   * 取值：0=禁用，1=启用
   * 当前配置：禁用（0），不编译从机 ASCII 相关代码
   */
#define MB_SLAVE_ASCII_ENABLED                  (  0 )

   /*! \brief 启用 Modbus 从机 RTU 模式
    * 取值：0=禁用，1=启用
    * 当前配置：禁用（0），不编译从机 RTU 相关代码
    */
#define MB_SLAVE_RTU_ENABLED                    (  1 )

    /*! \brief 启用 Modbus TCP 模式（通用，非主从特定）
     * 取值：0=禁用，1=启用
     * 当前配置：禁用（0），不编译 TCP 相关公共代码
     */
#define MB_TCP_ENABLED                          (  0 )

     /*! \brief Modbus ASCII 模式的字符超时时间（单位：秒）
      * 说明：ASCII 模式的字符超时不是固定值，需根据网络最大延迟配置，
      * 超过此时间未收到新字符，则认为帧结束。
      * 当前配置：1秒
      */
#define MB_ASCII_TIMEOUT_SEC                    (  1 )

      /*! \brief ASCII 模式下，发送前等待的时间（单位：毫秒）
       * 说明：部分设备因处理速度快，接收后立即发送可能导致对方接收不完整，
       * 此配置用于在启用发送器前插入延迟。
       * 当前配置：0毫秒（无延迟，可根据硬件调整）
       */
#ifndef MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS
#define MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS    ( 0 )
#endif

       /*! \brief 协议栈支持的最大 Modbus 功能码数量
        * 说明：需大于所有启用的功能码（包括自定义功能码）总和，值过小会导致添加功能失败。
        * 当前配置：16个（足够覆盖常用功能码）
        */
#define MB_FUNC_HANDLERS_MAX                    ( 16 )

        /*! \brief “报告从机 ID”命令的缓冲区大小（单位：字节）
         * 说明：仅当 MB_FUNC_OTHER_REP_SLAVEID_ENABLED 为 1 时有效，
         * 限制从机 ID 报告中附加数据的最大长度。
         * 当前配置：32字节
         */
#define MB_FUNC_OTHER_REP_SLAVEID_BUF           ( 32 )

         /*! \brief 启用“报告从机 ID”功能码（0x11）
          * 取值：0=禁用，1=启用
          * 当前配置：启用（1），支持从机报告自身 ID 信息
          */
#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED       (  1 )

          /*! \brief 启用“读输入寄存器”功能码（0x04）
           * 取值：0=禁用，1=启用
           * 当前配置：启用（1），支持读取从机输入寄存器（只读，通常映射硬件输入）
           */
#define MB_FUNC_READ_INPUT_ENABLED              (  1 )

           /*! \brief 启用“读保持寄存器”功能码（0x03）
            * 取值：0=禁用，1=启用
            * 当前配置：启用（1），支持读取从机保持寄存器（可读写，用于存储配置/数据）
            */
#define MB_FUNC_READ_HOLDING_ENABLED            (  1 )

            /*! \brief 启用“写单个保持寄存器”功能码（0x06）
             * 取值：0=禁用，1=启用
             * 当前配置：启用（1），支持写入单个保持寄存器
             */
#define MB_FUNC_WRITE_HOLDING_ENABLED           (  1 )

             /*! \brief 启用“写多个保持寄存器”功能码（0x10）
              * 取值：0=禁用，1=启用
              * 当前配置：启用（1），支持批量写入多个保持寄存器
              */
#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED  (  1 )

              /*! \brief 启用“读线圈”功能码（0x01）
               * 取值：0=禁用，1=启用
               * 当前配置：启用（1），支持读取从机线圈状态（单比特，可读写）
               */
#define MB_FUNC_READ_COILS_ENABLED              (  1 )

               /*! \brief 启用“写单个线圈”功能码（0x05）
                * 取值：0=禁用，1=启用
                * 当前配置：启用（1），支持写入单个线圈状态
                */
#define MB_FUNC_WRITE_COIL_ENABLED              (  1 )

                /*! \brief 启用“写多个线圈”功能码（0x0F）
                 * 取值：0=禁用，1=启用
                 * 当前配置：启用（1），支持批量写入多个线圈状态
                 */
#define MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED    (  1 )

                 /*! \brief 启用“读离散输入”功能码（0x02）
                  * 取值：0=禁用，1=启用
                  * 当前配置：启用（1），支持读取从机离散输入（单比特，只读，通常映射硬件输入）
                  */
#define MB_FUNC_READ_DISCRETE_INPUTS_ENABLED    (  1 )

                  /*! \brief 启用“读/写多个保持寄存器”功能码（0x17）
                   * 取值：0=禁用，1=启用
                   * 当前配置：启用（1），支持同时读取和写入多个保持寄存器
                   */
#define MB_FUNC_READWRITE_HOLDING_ENABLED       (  1 )


                   /* 仅当启用主机 RTU 或 ASCII 模式时，以下配置生效 */
#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0

/*! \brief 主机发送广播帧后的转换延迟时间（单位：毫秒）
 * 说明：广播帧无需从机响应，主机需等待此时间后再发送新帧，确保总线稳定。
 * 当前配置：200毫秒
 */
#define MB_MASTER_DELAY_MS_CONVERT              (200 )

 /*! \brief 主机发送非广播帧后的响应超时时间（单位：毫秒）
  * 说明：非广播帧需等待从机响应，超过此时长未收到响应则视为超时错误。
  * 当前配置：100毫秒
  */
#define MB_MASTER_TIMEOUT_MS_RESPOND            (100 )

  /*! \brief Modbus 主机系统中的从机总数
   * 说明：从机 ID 需从 1 开始连续编号（如总数为80，则 ID 范围 1~80）。
   * 当前配置：80个
   */
#define MB_MASTER_TOTAL_SLAVE_NUM               ( 80)

#endif

   /*! @} */  // 结束 modbus_cfg 分组

#ifdef __cplusplus
    PR_END_EXTERN_C  // 结束 C 语言编译模式
#endif

#endif














